package fa7.socialcode.web;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ResourceBundle;

import javax.faces.FactoryFinder;
import javax.faces.application.ApplicationFactory;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import fa7.socialcode.model.Comunidade;
import fa7.socialcode.model.Noticia;
import fa7.socialcode.model.Topico;
import fa7.socialcode.model.Usuario;
import fa7.socialcode.service.TopicoManager;

public class TopicoForm {
	
	private final Log log = LogFactory.getLog(TopicoForm.class);
    private String id;
    public Topico topico = new Topico();
    public Topico subtopico = new Topico();
    public TopicoManager mgr;
    
    public Topico getSubtopico() {
      return subtopico;
    }

    public void setSubtopico(Topico subtopico) {
      this.subtopico = subtopico;
    }

    private Long comunidadeId;
    
    private Usuario usuarioInSession;
    
    public Usuario getUsuarioInSession() {
		return usuarioInSession;
	}

	public void setUsuarioInSession(Usuario usuarioInSession) {
		this.usuarioInSession = usuarioInSession;
	}

	public Long getComunidadeId() {
		return comunidadeId;
	}

	public void setComunidadeId(Long comunidadeId) {
		this.comunidadeId = comunidadeId;
	}

	private ArrayList<SelectItem> listaDeComunidades = null;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Topico getTopico() {
        return topico;
    }

    public void setTopico(Topico topico) {
        this.topico = topico;
    }

    public void setTopicoManager(TopicoManager topicoManager) {
        this.mgr = topicoManager;
    }

    public String edit() {
      if (id != null) {
          // assuming edit
          setTopico(mgr.findTopico(id));
      }

      return "success";
  }

    public String responder() {
       System.out.println("Alo mamae");
      if (id != null) {
          // assuming edit
          setTopico(mgr.findTopico(id));
      }

      return "responder";
  }

    public String save() {
      Topico not = getTopico();
      not.setUsuario(getUsuarioInSession());
      mgr.saveTopico(not, comunidadeId);
      addMessage("noticia.saved", getTopico().getTitulo());

      return "success";
  }

    public String saveSubtopico() {
      Topico top = mgr.findTopico(topico.getId().toString());
      subtopico.setUsuario(getUsuarioInSession());
      
      mgr.saveTopico(getSubtopico());
      top.addSubtopico(getSubtopico());
      //System.out.println(getSubtopico().getId());
      top.setUsuario(getUsuarioInSession());
      mgr.saveTopico(top);
      addMessage("noticia.saved", getTopico().getTitulo());

      return "success";
  }

    public String delete() {
        mgr.removeTopico(getTopico().getId().toString());
        addMessage("topico.deleted", getTopico().getTitulo());

        return "success";
    }
    
    public ArrayList<SelectItem> getListaDeComunidades() {

		listaDeComunidades = new ArrayList<SelectItem>();

		List<Comunidade> comunidades = mgr.findComunidades();

		listaDeComunidades.add(new SelectItem("", "Selecione a Comunidade"));

		for (Comunidade comunidade : comunidades) {
			listaDeComunidades.add(new SelectItem("" + comunidade.getId(),
					comunidade.getDescricao()));
		}

		return listaDeComunidades;
	}

    // Convenience methods ====================================================
    public static String getRequestParameter(String name) {
        return (String) FacesContext.getCurrentInstance().getExternalContext()
                                    .getRequestParameterMap().get(name);
    }

    public void addMessage(String key, String arg) {
        // sure is a lot of work to get the named ResourceBundle in JSF, eh?
        ApplicationFactory factory =
            (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
        String bundleName = factory.getApplication().getMessageBundle();
        ResourceBundle messages = ResourceBundle.getBundle(bundleName);
        
        // it's even more work to format a message with args 
        MessageFormat form = new MessageFormat(messages.getString(key));

        String msg = form.format(new Object[] { arg });
        
        // add message to session so it can live past redirects
        // the MessageFilter class will take care of removing it
        HttpSession session =
            (HttpSession) FacesContext.getCurrentInstance().getExternalContext()
                                      .getSession(true);
        session.setAttribute("message", msg);
    }

}
